package chapter3;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class DemoTest {

    /**
     * 环绕执行模式
     *  例如 资源的处理(处理文件或数据库)时一个常见的模式是打开一个资源，做一些处理 然后关闭资源
     *  这里就是 将对文件的处理 参数化 而传递行为是Lambda的拿手好戏
     *  Lambda仅可用于上下文是函数式接口的情况  因此需要创建一个能适配BufferedReader -> String 还可以抛出IOException异常的接口
     * @return
     * @throws IOException
     */
    public static String processFile() throws IOException{
        try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
            return br.readLine();
        }
    }


    /**
     * 将函数接口 传递给新的processFile方法作为参数
     * 现在任何BufferedReader -> String形式的Lambda都可以作为参数来传递  因为它们符合BufferedReaderProcessor接口中定义的process方法的签名
     * 现在就能传递不同的Lambda重用processFile方法 并以不同的方式处理文件
     */
    public static String processFile2(BufferedReaderProcessor p) throws IOException{
        try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
            return p.process(br);
        }
    }


    public static void main(String[] args) throws Exception {
        //处理一行
        String oneLine = processFile2((BufferedReader br) -> br.readLine());

        //处理两行
        String twoLine = processFile2((BufferedReader br) -> br.readLine() + br.readLine());

    }
}
